home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / cc02.zip / CMODEM.C < prev    next >
Text File  |  1985-05-09  |  16KB  |  572 lines

  1. /*THIS FILE MAY REQUIRE THE INFORMATION CONTAINED IN ANOTHER FILE
  2.   CALLED "DCH.H" TO BE PROPERLY IMPLEMENTED.
  3.                               
  4.                              Calamity Cliffs Computer Center
  5. */
  6.  
  7. /*This program implements the Ward Christenson assembly language
  8.   program in C.  All of the original modes are available, and a
  9.   capture buffer was added to the terminal and computer modes.
  10.   The UNIX and PDP10 modes were added to facilitate sending files
  11.   to those systems.,  Note that this program as written is for the
  12.   original version of the D. C. Hayes modem board. However, it will
  13.   execute correctly on the newer Modem-100 board.
  14.  
  15.                                       Jack M. Wierda
  16. */
  17. #define      DCHDP  128        /*D. C. HAYES DATA PORT*/
  18. #define      DCHMASK  255      /*D. C. HAYES DATA MASK*/
  19.  
  20. #define      DCHSP  129        /*D. C. HAYES STATUS PORT*/
  21. /*STATUS PORT BIT ASSIGNMENTS*/
  22. #define      RRF         1   /*RECEIVE REGISTER FULL*/
  23. #define      TRE         2   /*TRANSMIT REGISTER EMPTY*/
  24. #define      PERR        4   /*PARITY ERROR*/
  25. #define      FERR        8   /*FRAMING ERROR*/
  26. #define      OERR        16  /*OVERFLOW ERROR*/
  27. #define      CD          64  /*CARRIER DETECT*/
  28. #define      NRI         128 /*NO RINGING INDICATOR*/
  29.  
  30. #define      DCHCP1      129 /*D. C. HAYES CONTROL PORT 1*/
  31. /*CONTROL PORT 1 BIT ASSIGNMENTS*/
  32. #define      EPE         1   /*EVEN PARITY ENABLE*/
  33. #define      LS1         2   /*LENGTH SELECT 1*/
  34. #define      LS2         4   /*LENGTH SELECT 2*/
  35. #define      SBS         8   /*STOP BIT SELECT*/
  36. #define      PI          16  /*PARITY INHIBIT*/
  37.  
  38. #define      DCHCP2  130       /*D. C. HAYES CONTROL PORT 2*/
  39. /*CONTROL PORT 2 BIT ASSIGNMENTS*/
  40. #define      BRS         1   /*BIT RATE SELECT*/
  41. #define      TXE         2   /*TRANSMIT ENABLE*/
  42. #define      MS          4   /*MODE SELECT*/
  43. #define      ES          8   /*ECHO SUPPRESS*/
  44. #define      ST          16  /*SELF TEST*/
  45. #define      RID         32  /*RING INDICATOR DISABLE*/
  46. #define      OH          128 /*OFF HOOK*/
  47.  
  48. #define      FALSE  0
  49. #define      TRUE  1
  50. #define      NUL  0
  51. #define      SOH  1
  52. #define      CTRLB 2
  53. #define      CTRLC  3
  54. #define      EOT  4
  55. #define      ERRORMAX  5
  56. #define      RETRYMAX  5
  57. #define      CTRLE  5
  58. #define      ACK  6
  59. #define      TAB  9
  60. #define      LF  10
  61. #define      CR  13
  62. #define      CTRLQ  17
  63. #define      SPS 2750           /*loops per second*/
  64. #define      CTRLS  19
  65. #define      NAK  21
  66. #define      CTRLZ  26
  67. #define      SPACE  32
  68. #define      DELETE  127
  69. #define      TIMEOUT  -1
  70. #define      SECSIZ  0x80
  71. #define      BUFSIZ  0x7f80    /*maximum size, 0x8000 will not work with
  72.                   with BDS C, reduce buffer size as necessary
  73.                                   for smaller systems*/
  74.  
  75. char dchcw1, dchcw2;
  76. char hangup, option, option2, mode, baudrate, display, system;
  77. char asciiflg, showtrans, showrecv, view;
  78. char buffer[BUFSIZ];
  79.  
  80. sendline(data)
  81. char data;
  82. {
  83.   while(!statp(DCHSP,TRE,TRE));
  84.   outp(DCHDP,data);
  85.   if(showtrans)
  86.     { if(asciiflg)
  87.         if(((data >= ' ') && (data <= 0x7f)) || data == LF || data == CR 
  88.             || data == TAB)
  89.           putchar(data);
  90.         else
  91.           printf("[%0x]",data);
  92.       if(option2 == 'H')
  93.         printf("[%0x]",data);
  94.     }
  95. }
  96.  
  97. readline(seconds)
  98. int seconds;
  99. {
  100.   char data;
  101.   seconds = seconds * SPS;
  102.   while (!statp(DCHSP,RRF,RRF) && seconds--);
  103.   if(seconds < 0)
  104.     return(TIMEOUT);
  105.   data = input(DCHDP,DCHMASK);
  106.   if(showrecv)
  107.     { if(asciiflg)
  108.         if(((data >= ' ') && (data <= 0x7f)) || data == LF || data == CR 
  109.             || data == TAB)
  110.           putchar(data);
  111.         else
  112.           printf("[%0x]",data);
  113.       if(option2 == 'H')
  114.         printf("<%0x>",data);
  115.     }
  116.   return(data);
  117. }
  118.  
  119. purgeline()
  120. {
  121.   while(statp(DCHSP,RRF,RRF))
  122.     input(DCHDP,DCHMASK);   /*PURGE THE RECEIVE REGISTER*/
  123. }
  124.  
  125. dchinitialize()
  126. {
  127.   char cdflg;
  128.   cdflg = TRUE;
  129.   if((option == 'R') || (option == 'S'))
  130.     { dchcw1 = PI+LS2+LS1;
  131.       dchcw2 = OH+RID+TXE+dchcw2;
  132.     }
  133.   else
  134.     { dchcw1 = LS2+EPE;
  135.       dchcw2 = OH+RID+TXE+dchcw2;
  136.     }
  137.   if(!statp(DCHSP,CD,CD))
  138.     { printf("Waiting for carrier\n");
  139.       cdflg = FALSE;
  140.     }
  141.   while(!statp(DCHSP,CD,CD) && !bios(2))
  142.     { outp(DCHCP2,dchcw2);
  143.       outp(DCHCP1,dchcw1);
  144.     }
  145.   if(statp(DCHSP,CD,CD) && !cdflg)
  146.     printf("Carrier detected\n");
  147.   purgeline();
  148. }
  149.  
  150. sendstr(str)
  151. char *str;
  152. {
  153.   while(*str)
  154.     if(option == 'U')
  155.       sendline(tolower(*str++));
  156.     else
  157.       sendline(*str++);
  158. }
  159.  
  160. termcomp()
  161. {
  162.   char bflag, kbdata, dchdata;
  163.   int fd;
  164.   int bufctr;
  165.   bflag = FALSE;
  166.   bufctr = 0;
  167.   dchinitialize();
  168.   while((statp(DCHSP,CD,CD)) && (kbdata != CTRLE))
  169.     { if(bios(2))
  170.         switch(kbdata = bios(3))
  171.           { case CTRLB:
  172.               bflag = ~bflag;
  173.               if(bflag)
  174.                 printf("Capture initiated");
  175.               else
  176.                 printf("Capture terminated");
  177.               printf(", %u bytes free\n",BUFSIZ - bufctr);
  178.               break;
  179.             case CTRLE:
  180.               break;
  181.             default:
  182.               if(option == 'C')
  183.                 { putchar(kbdata);
  184.                   if(bflag && (bufctr < BUFSIZ))
  185.                     buffer[bufctr++] = kbdata;
  186.                 }
  187.               outp(DCHDP,kbdata);
  188.               break;
  189.           }
  190.       if(statp(DCHSP,RRF,RRF))
  191.         { dchdata = input(DCHDP,DCHMASK);
  192.           if(option == 'C')
  193.             outp(DCHDP,dchdata);
  194.           if(bflag && (bufctr < BUFSIZ))
  195.             buffer[bufctr++] = dchdata;
  196.           else if(bflag)
  197.             printf("Buffer overflow\n");
  198.           putchar(dchdata);
  199.         }
  200.     }
  201.   if(bufctr)
  202.     { buffer[bufctr] = CTRLZ;
  203.       fd = creat("cmodem.tmp");
  204.       if(fd == -1)
  205.         { printf("Cannot create cmodem.tmp\n");
  206.           exit();
  207.         }
  208.       write(fd,buffer,1 + (bufctr/SECSIZ));
  209.       close(fd);
  210.     }
  211. }
  212.  
  213. putbuffer(buffer,sectors)
  214. char *buffer;
  215. int sectors;
  216. {
  217.   char ch, dchdata; 
  218.   unsigned  k;
  219.   ch = 0;
  220.   k = 0;
  221.   while((ch != CTRLZ) && (k < sectors * SECSIZ) && (statp(DCHSP,CD,CD)))
  222.         { k = k+1;
  223.           if((ch = *buffer++) == LF)        /*don't send LF's*/
  224.             putchar(LF);
  225.           else
  226.             if(ch != CTRLZ || option != 'U') /*don't send CTRLZ to UNIX*/
  227.               sendline(ch);
  228.           if(!(k & 0xff))                   /*let other end catch-up*/ 
  229.              while(readline(1) != TIMEOUT);
  230.         }
  231. }
  232.  
  233. pdp10(file)
  234. char *file;
  235. {
  236.   char sectors;
  237.   int fd;
  238.   showrecv = FALSE;
  239.   asciiflg = showtrans = TRUE;
  240.   fd = open(file,0);
  241.   if(fd == -1)
  242.     { printf("Cannot open %s\n",file);
  243.       exit();
  244.     }
  245.   dchinitialize();
  246.   if(option == 'P')
  247.     { sendstr("\nR PIP\n");
  248.       while((readline(1) != '*') && !bios(2));
  249.       if(*(++file) != ':')
  250.         sendstr(--file);
  251.       else
  252.         sendstr(++file);
  253.       sendstr("=TTY:\n");
  254.     }
  255.   else
  256.     { sendstr("\ncat > ");
  257.       if(*(++file) != ':')
  258.         sendstr(--file);
  259.       else
  260.         sendstr(++file);
  261.       sendstr("\n");
  262.     }
  263.   while((sectors = read(fd,buffer,BUFSIZ/SECSIZ)) == BUFSIZ/SECSIZ)
  264.     putbuffer(buffer,sectors);
  265.   if(sectors)
  266.     putbuffer(buffer,sectors);
  267.   close(fd);
  268.   while(readline(1) != TIMEOUT);
  269.   if(option == 'P')
  270.     sendline(CTRLC);
  271.   else
  272.     { sendline(CR);
  273.       sendline(LF);
  274.       sendline(EOT);
  275.     }
  276.   while(readline(10) != TIMEOUT);
  277.   sendline(CR);
  278.   sendline(LF);
  279. }
  280.  
  281. readfile(file)
  282. char *file;
  283. { int j, firstchar, sectnum, sectcurr, sectcomp, errors;
  284.   int checksum;
  285.   int errorflag, fd;
  286.   int bufctr;
  287.  
  288.   if(view)
  289.     { showrecv = TRUE;
  290.       showtrans = FALSE;
  291.     }
  292.   option2 = 'A';
  293.   fd = creat(file);
  294.   if(fd == -1)
  295.     { printf("Cannot create %s\n",file);
  296.       exit();
  297.     }
  298.   sectnum = 0;
  299.   errors = 0;
  300.   bufctr = 0;
  301.   dchinitialize();
  302.   sendline(NAK);
  303.   do
  304.     { errorflag = FALSE;
  305.       do
  306.         firstchar = readline(6);
  307.       while(firstchar != SOH && firstchar != EOT && firstchar != TIMEOUT);
  308.